import sys # 导入sys模块，用于处理程序的退出操作

# 开支类别
categories = {
    "1": "食品",
    "2": "娱乐",
    "3": "学习用品",
    "4": "其他"
}

# 开支记录字典
expenses = {}
# 开支记录输入（a部分）
def input_expenses():
    date = input("请输入日期（例如：2月11日）：") # 获取用户输入的日期
    category = input("请选择开支类别（1食品、2娱乐、3学习用品、4其他）：") # 获取用户选择的开支类别
    amount = input("请输入开支金额：") # 获取用户输入的开支金额

    # 检查输入合法性
    try:
        amount = float(amount) # 尝试将输入的金额转换为浮点数，确保金额是数字
        if category not in categories: # 如果输入的类别不在预定义的类别中
            raise ValueError # 抛出值错误异常
    except ValueError:
        print("输入非法，请重新输入。") # 如果出现异常，提示用户重新输入
        sys.exit(1) # 异常退出程序，返回状态码1

    return {date: {categories[category]: amount}} # 返回一个包含日期和对应开支类别的字典
# 开支汇总记录（b部分）
def update_expenses(new_expenses):
    global expenses
    for date, categories in new_expenses.items(): # 遍历新输入的开支记录中的每个日期和类别（a部分的返回值）
        if date not in expenses: # 如果日期不在总开支记录中
            expenses[date] = categories # 将新的开支记录直接添加到总开支记录中
        else:
            for category, amount in categories.items(): # 如果日期已存在，遍历新开支记录中的每个类别和金额
                if category not in expenses[date]: # 如果类别不在已有的日期开支记录中
                    expenses[date][category] = amount # 将新的类别和金额添加到该日期的开支记录中
                else:
                    expenses[date][category] += amount # 如果类别已存在，将金额累加到已有的金额上
# 开支记录保存与读取（c部分）
def save_expenses():
    with open("expenses.txt","w",encoding ='utf-8') as f: # 以写入模式打开名为expenses.txt的文件
        f.write(str(expenses)) # 将开支记录字典转换为字符串并写入文件
def load_expenses():
    global expenses
    try:
        with open("expenses.txt", "r",encoding ='utf-8') as f: # 以读取模式打开expenses.txt文件
            expenses = eval(f.read()) # 使用eval函数将读取的字符串转换为字典
    except FileNotFoundError:
        pass # 如果文件不存在，不做任何操作，直接跳过
# 开支总览展示（d部分）
def print_expenses():
    for date, categories in expenses.items(): # 遍历总开支记录中的每个日期和类别
        print(f"{date}总开支：", end="\t") # 打印日期和总开支的标题，不换行
        for category, amount in categories.items(): # 遍历每个日期中的类别和金额
            print(f"{category} - {amount}元", end="\t") # 打印类别和金额，不换行
        print() # 换行
# 主函数
def main():
    load_expenses() # 加载历史开支记录
    new_expenses = input_expenses() # 获取新的开支记录
    update_expenses(new_expenses) # 更新总开支记录
    save_expenses() # 保存开支记录
    print_expenses() # 打印总开支记录
if __name__ == "__main__":
    main()